iT邦幫忙

2022 iThome 鐵人賽

DAY 13
1
Modern Web

Parser 的深入研究系列 第 13

[Day13] - 簡易 HTML 的 Parse 實作示意圖

  • 分享至 

  • xImage
  •  

如何將 HTML 的 Tokens 轉換成目標 AST 呢?

今天我們來說明一下

第零步,確定輸入 & 輸出

預期輸出 - Tokens

const tokens = [
    {"type": "tagStart", "name": "div"},
    {"type": "tagStart", "name": "p"},
    {"type": "text", "content": "Vue"},
    {"type": "tagEnd", "name": "p"},
    {"type": "tagSelfClose", "name": "input"},
    {"type": "tagStart", "name": "p"},
    {"type": "text", "content": "Template"},
    {"type": "tagEnd", "name": "p"},
    {"type": "tagEnd", "name": "div"},
]

預計輸出 - AST

const AST = {
    type: 'root',
    children: [
        {
            "type": "div",
            "children": [
                {
                    "type": "p",
                    "children": [
                        {
                            "type": "text",
                            "content": "Vue"
                        }
                    ]
                },
                {"type": "input"},
                {
                    "type": "p",
                    "children": [
                        {
                            "type": "text",
                            "content": "Template"
                        }
                    ]
                }
            ]
        }
    ]
}

第一步,藉由 elementStack 來記錄目前的父子關係,建構 AST

依照以下規則來建立 AST

  1. 如果是 tagStart,則建立一個新的 node A,node A 當作 elementStack 的最後一個元素的 children,並將 node A push elementStack
  2. 如果是 tagEnd,則 pop elementStack 的最後一個元素
  3. 如果是 tagSelfClose 或 Text,則建立一個新的 node A,node A 當作 elementStack 的最後一個元素的 children

html-tokens-parser
html-tokens-parser
html-tokens-parser
html-tokens-parser
html-tokens-parser
html-tokens-parser
html-tokens-parser
html-tokens-parser
html-tokens-parser


明天就根據上面的圖實作 Tokens 轉換成 AST 的 Parser 吧 ( •̀ ω •́ )✧

參考資料


上一篇
[Day12] - HTML 的 Tokenizer 實作
下一篇
[Day14] - 簡易 HTML 的 Parse 實作
系列文
Parser 的深入研究32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
lagagain
iT邦新手 2 級 ‧ 2022-10-16 08:12:18

AST長得感覺好多了~

Tree iT邦新手 3 級 ‧ 2022-10-17 08:36:40 檢舉

謝拉 /images/emoticon/emoticon41.gif

我要留言

立即登入留言